package org.fluentlenium.core.css; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringEscapeUtils; import org.fluentlenium.core.script.JavascriptControl; import org.fluentlenium.core.wait.AwaitControl; import org.openqa.selenium.WebDriverException; import java.io.IOError; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; /** * Features related to CSS loaded in the active page. */ public class CssSupportImpl implements CssSupport { private final JavascriptControl javascriptControl; private final AwaitControl awaitControl; /** * Creates a new implementation of css support * * @param javascriptControl javascript control * @param awaitControl await control */ public CssSupportImpl(JavascriptControl javascriptControl, AwaitControl awaitControl) { this.javascriptControl = javascriptControl; this.awaitControl = awaitControl; } @Override public void inject(String cssText) { InputStream injectorScript = getClass().getResourceAsStream("/org/fluentlenium/core/css/injector.js"); String injectorJs; try { injectorJs = IOUtils.toString(injectorScript, Charset.forName("UTF-8")); } catch (IOException e) { throw new IOError(e); } finally { IOUtils.closeQuietly(injectorScript); } cssText = cssText.replace("\r\n", "").replace("\n", ""); cssText = StringEscapeUtils.escapeEcmaScript(cssText); executeScriptRetry("cssText = \"" + cssText + "\"" + ";\n" + injectorJs); } @Override public void injectResource(String cssResourceName) { InputStream cssStream = getClass().getResourceAsStream(cssResourceName); String cssText; try { cssText = IOUtils.toString(cssStream, Charset.forName("UTF-8")); } catch (IOException e) { throw new IOError(e); } finally { IOUtils.closeQuietly(cssStream); } inject(cssText); } private void executeScriptRetry(String script) { int retries = 0; while (true) { try { javascriptControl.executeScript(script); break; } catch (WebDriverException e) { retries += 1; if (retries >= 10) { throw e; } awaitControl.await().explicitlyFor(250L); } } } }